/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Servlets;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;

import com.akcess.vo.*;
import com.akcess.exception.*;
import manejadores.*;
import java.util.*;
import java.sql.*;
import java.sql.Date;

/**
 *
 * @author Alejandro
 */
public class GestionarRecurso_Sala_de_Maquinas extends HttpServlet {

    private static final String dirBASE = "jsp/SalaDeMaquinas";

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet GestionarRecursos_Aulas</title>");  
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet GestionarRecursos_Aulas at " + request.getContextPath () + "</h1>");
            out.println("</body>");
            out.println("</html>");
             */
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String accion = request.getParameter("hacer");
        request.setAttribute("modulo", "Recurso Sala de Maquinas");
        if (accion.equals("Agregar")) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/AgregarSM.jsp");
            dispatcher.forward(request, response);
        }
        if (accion.equals("opAgregar")) {
            this.CrearRecursoSM(request, response);
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarSM.jsp");
            dispatcher.forward(request, response);
        }
        if (accion.equals("Listar")) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarSM.jsp");
            dispatcher.forward(request, response);
        }
        if (accion.equals("Modificar")) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarModificarSM.jsp");
            dispatcher.forward(request, response);
        }
        if (accion.equals("Borrar")) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarBorrarSM.jsp");
            dispatcher.forward(request, response);
        }
        if (accion.equals("opModificar")) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ModificarSM.jsp");
            dispatcher.forward(request, response);
        }
        if (accion.equals("opVer")) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/VerSM.jsp");
            dispatcher.forward(request, response);
        }
        if (accion.equals("modificacion")) {
            this.ModificarRecursoSM(request, response);
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarModificarSM.jsp");
            dispatcher.forward(request, response);
        }
        if (accion.equals("opBorrar")) {
            if (this.BorrarRecursoSM(request,response)) {
                    RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/ListarBorrarSM.jsp");
                    dispatcher.forward(request, response);
                } else {
                    request.setAttribute("Error", "La Sala no puede ser Borrada, pues existen reservas o solicitudes dependientes de la misma");
                    RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/ListarBorrarSM.jsp");
                    dispatcher.forward(request, response);
                }
        }

        if (accion.equals("opBorrarSO")) {
            if (this.BorrarSO(request, response)) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/GestionarSO.jsp");
                dispatcher.forward(request, response);
            } else {
                request.setAttribute("Error", "El SO no puede ser Borrado, debido ha que existen Salas que lo utilizan...");
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/GestionarSO.jsp");
                dispatcher.forward(request, response);
            }
        }
        if (accion.equals("opAgregarSO")) {
            if (this.AgregarSO(request, response)) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/GestionarSO.jsp");
                dispatcher.forward(request, response);
            } else {
                request.setAttribute("Error", "El SO no puede ser Agregado, asegurese de insertar todos los datos requeridos...");
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/GestionarSO.jsp");
                dispatcher.forward(request, response);
            }
        }
        if (accion.equals("Gestionar_SO")) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/GestionarSO.jsp");
            dispatcher.forward(request, response);
        }
        if (accion.equals("Asignar_Encargado")) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/ListarAsignarEncargado.jsp");
            dispatcher.forward(request, response);
        }

        if (accion.equals("opAsignar")) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/AsignarEncargado.jsp");
            dispatcher.forward(request, response);
        }

        if (accion.equals("opBorrarEncargado")) {
            if (this.BorrarEncargado(request, response)) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/AsignarEncargado.jsp");
                dispatcher.forward(request, response);
            } else {
                request.setAttribute("Error", "El Encargado no puede ser Borrado...");
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/AsignarEncargado.jsp");
                dispatcher.forward(request, response);
            }
        }

        if (accion.equals("opAsignarEncargado")) {
            if (this.AsignarEncargado(request, response)) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/AsignarEncargado.jsp");
                dispatcher.forward(request, response);
            } else {
                request.setAttribute("Error", "El Encargado no puede ser Agregado,ya existe en dicho turno o selecciono mal los datos...");
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE + "/AsignarEncargado.jsp");
                dispatcher.forward(request, response);
            }
        }

    }

    /** 
     * Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * Este metodo permite crear una Sala dentro del Sistema. Todos los datos ingresados en el formulariod necesarios para realizar la creacion de la 
     * Sala son obtenidos desde el request.
     * @param request
     * @param response
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    protected void CrearRecursoSM(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Vector SO = new Vector();

            Aulas aula = new Aulas();
            Recurso recurso = new Recurso();
            Sala_de_maquinas sala = new Sala_de_maquinas();

            aula.setId_ubicacion(Integer.parseInt(request.getParameter("Ubicacion")));
            aula.setNombre(request.getParameter("Nombre"));

            recurso.setObservacion(request.getParameter("Observacion"));
            recurso.setBorrado(false);
            recurso.setDisponible(true);
            Date fecha = new Date(System.currentTimeMillis());
            recurso.setFechacreacion(fecha);

            sala.setCant_maquinas(Integer.parseInt(request.getParameter("Cantidad")));

            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                if (cone != null) {
                    ManejadorSM manejadorRecurso = new ManejadorSM(cone);
                    So[] sistemas = manejadorRecurso.ObtenerSO();
                    for (int i = 0; i < sistemas.length; i++) {
                        if (Boolean.parseBoolean(request.getParameter(sistemas[i].getNombre().replace(" ", "_") + "_" + sistemas[i].getId_so()))) {
                            SO.add(sistemas[i]);
                        }
                    }
                    manejadorRecurso.CrearRecursoSM(recurso, aula, sala, SO);
                }
            }
        } catch (Sala_de_maquinasException ex) {
            ex.printStackTrace();
        } catch (SoException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Este metodo nos permite modificar los datos de una sala de Maquinas determinada. El id de la sala a modificar
     * es obtenido desde el request.
     * @param request
     * @param response
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    protected void ModificarRecursoSM(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Vector SO = new Vector();

            Aulas aula = new Aulas();
            aula.setId_recurso(Integer.parseInt(request.getParameter("id")));
            aula.setNombre(request.getParameter("Nombre"));
            aula.setId_ubicacion(Integer.parseInt(request.getParameter("Ubicacion")));

            Recurso recurso = new Recurso();
            recurso.setObservacion(request.getParameter("Observacion"));
            recurso.setDisponible(Boolean.parseBoolean(request.getParameter("Disponible")));
            recurso.setId_recurso((long) Integer.parseInt(request.getParameter("id")));

            Sala_de_maquinas sala = new Sala_de_maquinas();
            sala.setCant_maquinas(Integer.parseInt(request.getParameter("Cantidad")));
            sala.setId_sala(Integer.parseInt(request.getParameter("id")));

            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                if (cone != null) {
                    ManejadorSM manejadorRecurso = new ManejadorSM(cone);
                    So[] sistemas = manejadorRecurso.ObtenerSO();
                    for (int i = 0; i < sistemas.length; i++) {
                        if (Boolean.parseBoolean(request.getParameter(sistemas[i].getNombre().replace(" ", "_") + "_" + sistemas[i].getId_so()))) {
                            SO.add(sistemas[i]);
                        }
                    }
                    manejadorRecurso.ModificarRecursoSM(recurso, aula, sala, SO);
                }
            }
        } catch (Sala_de_maquinasException ex) {
            ex.printStackTrace();
        } catch (SoException ex) {
            ex.printStackTrace();
        }

    }

    /**
     * Mediante este metodo podemos realizar el borrado logico de una Sala de Maquinas. El id de la sala a borrar es
     * obtenido desde el request recibido.
     * @param request
     * @param response
     * @return Retorna True si el recurso fue borrado exitosamente y False en otro caso.
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    protected boolean BorrarRecursoSM(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            int id = Integer.parseInt(request.getParameter("id"));
            HttpSession session = request.getSession(false);
            Connection cone;
            cone = (Connection) session.getAttribute("conexion");
            ManejadorRecursoMovil manejador = new ManejadorRecursoMovil(cone);
            manejador.BorrarRM(id);
            return true;
        } catch (RecursoException ex) {
            return false;
            
        }

    }

    /**
     * Permite borrar un SO que fue asignado a una Sala en particular. El id de la Sala y el id del SO que se quitara de ls
     * sala son obtenidos desde el request recibido. El borrado que se realiza es un borrado fisico.
     * @param request
     * @param response
     * @return Retorna True si el borrado pudo realizarse perfectamente y False en otro caso.
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    protected boolean BorrarSO(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            int idSO = Integer.parseInt(request.getParameter("id"));
            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                if (cone != null) {
                    ManejadorSO manejador = new ManejadorSO(cone);
                    manejador.BorrarSO(idSO);
                    return true;
                }
            }
            return false;
        } catch (SoException ex) {
            return false;
        }
    }

    /**
     * Este metodo nos permite crear nuevos tipos de SO que pueden existir en las salas. Los datos necesarios para la 
     * creacion del nuevo SO son insertados en el formulario para el efecto, y dichos datos son obtenidos desde el 
     * request recibido.
     * @param request
     * @param response
     * @return Retorna True si el SO pudo ser agregado correctamente y False en otro caso.
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    protected boolean AgregarSO(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            So sistema = new So();
            sistema.setNombre(request.getParameter("nombreSO"));
            sistema.setObs(request.getParameter("Observacion"));

            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                if (cone != null) {
                    ManejadorSO manejador = new ManejadorSO(cone);
                    manejador.AgregarSO(sistema);
                    return true;
                }
            }
            return false;
        } catch (SoException ex) {
            return false;
        }
    }

    /**
     * Realiza el borrado de un encargado que fue asignado a la Sala.No se realiza el borrado del encargado sino que 
     * se realiza el borrado de la asignacion del encargado a la sala especifica. El id de la Sala y del encargado 
     * son obtenidos del request recibido para realizar el borrado.
     * @param request
     * @param response
     * @return Retorna True si el Encargado pudo ser borrado correctamente y False en otro caso.
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    protected boolean BorrarEncargado(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            int idSala = Integer.parseInt(request.getParameter("id"));
            int idEncargado = Integer.parseInt(request.getParameter("idEncargado"));
            String turno = request.getParameter("turno");
            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                if (cone != null) {
                    ManejadorSM manejador = new ManejadorSM(cone);
                    manejador.BorrarEncargado(idSala, idEncargado, turno);
                    return true;
                }
            }
            return false;
        } catch (Tiene_encargadosException ex) {
            return false;
        }
    }
    
    /**
     * Este metodo permite asignar un Recurso Humano determinado a una Sala especifica, tambien se determina el turno en 
     * que el RRHH sera encargado. EL id de la sala, del RRHH y del turno son obtenidos del request, datos que son necesarios
     * para realizar la asignacion.
     * @param request
     * @param response
     * @return Retorna True si la Asignacion pudo ser llevada a cabo correctamente y False en otro caso.
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    protected boolean AsignarEncargado(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Tiene_encargados encargado = new Tiene_encargados();
            encargado.setId_sala((long)Integer.parseInt(request.getParameter("id")));
            encargado.setId_encargado((long)Integer.parseInt(request.getParameter("Encargado")));
            encargado.setTurno(request.getParameter("Turno"));
                    
            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                if (cone != null) {
                    ManejadorSM manejador = new ManejadorSM(cone);
                    manejador.AsignarEncargado(encargado);
                    return true;
                }
            }
            return false;
        } catch (Exception ex) {
            return false;
        }
    }
    
}
